#include<iostream>
#include"nodeList.h"
#include"node.h"

/**
 * Létrehoz egy (üres) Node listát (tömböt)
 */
NodeList::NodeList()
{
    this->size=0;
    this->nodes=new Node*[this->size];
}

/**
 * Megszünteti a lefoglalt tömböt (a pointereket nem, azt manuálisan a dropNodes() teszi meg)
 */
NodeList::~NodeList()
{
    delete[] this->nodes;
}

/**
 * Kitörli a Node-okat
 */
void NodeList::dropNodes()
{
    for(int i=0;i<this->size;i++)
    {
        delete this->nodes[i];
    }
}

/**
 * Hozzáad a listához egy új Node-ot.
 * @param newNode Az új csúcspont a listában
 */
void NodeList::addNode(Node* newNode)
{
    Node** tmp=this->nodes;
    this->nodes=new Node*[this->size+1];
    for(int i=0;i<this->size;i++)
    {
        this->nodes[i]=tmp[i];
    }
    delete[] tmp;
    this->nodes[this->size++]=newNode;
}

/**
 * Index operátor a tömb eléréséhez. Indexhatárokat is vizsgál, hiba esetén kivételt dob.
 * @param n Az elérni kívánt elem indexe
 * @return Az elérni kívánt elem.
 */
Node* NodeList::operator[](int n)
{
    if(n<0)
        throw "Index UnderFlow";
    if(n>this->size)
        throw "Index OverFlow";
    return this->nodes[n];
}

/**
 * Visszaadja a lista méretét
 * @return A lista mérete
 */
int NodeList::getSize()
{
    return this->size;
}

/**
 * Megvizsgálja, létezik-e megadott azonosítójú elem a listában
 * @param n A keresett azonosító
 * @return Létezik-e
 */
bool NodeList::nodeExists(int n)
{
    for(int i=0;i<this->size;i++)
    {
        if(this->nodes[i]->getId()==n)
        {
            return true;
        }
    }
    return false;
}
